import Config from '../utils/Config.js';
import Utils from '../utils/Utils.js';

/**
 * 微信小游戏适配管理器
 * 负责处理不同设备的屏幕适配和性能优化
 */
export default class AdaptManager {
    constructor() {
        this.deviceInfo = null;
        this.adaptInfo = null;
        this.canvas = null;
        this.ctx = null;
        this.isInitialized = false;
    }

    /**
     * 初始化适配管理器
     */
    init() {
        console.log('微信小游戏适配管理器初始化...');
        
        // 获取设备信息
        this.deviceInfo = Utils.getDeviceInfo();
        console.log('设备信息:', this.deviceInfo);
        
        // 计算适配参数
        this.adaptInfo = Utils.adaptToScreen();
        console.log('适配信息:', this.adaptInfo);
        
        // 设置canvas适配
        this.setupCanvasAdapt();
        
        // 优化性能设置
        this.optimizePerformance();
        
        this.isInitialized = true;
        console.log('微信小游戏适配完成');
    }

    /**
     * 设置Canvas适配
     */
    setupCanvasAdapt() {
        this.canvas = wx.createCanvas();
        this.ctx = this.canvas.getContext('2d');
        
        // 设置canvas物理尺寸
        this.canvas.width = Config.GAME.WIDTH;
        this.canvas.height = Config.GAME.HEIGHT;
        
        // 根据设备像素比优化渲染质量
        const pixelRatio = this.deviceInfo.pixelRatio;
        if (pixelRatio > 1) {
            // 高分辨率设备优化
            this.ctx.scale(1, 1); // 保持1:1比例，避免模糊
        }
        
        console.log(`Canvas适配完成: ${this.canvas.width}x${this.canvas.height}, 像素比: ${pixelRatio}`);
    }

    /**
     * 优化性能设置
     */
    optimizePerformance() {
        // 根据设备性能调整游戏设置
        const { platform, system } = this.deviceInfo;
        
        // iOS设备优化
        if (platform === 'ios') {
            Config.ANIMATION.DURATION = 250; // 稍微减少动画时间
        }
        
        // Android设备优化
        if (platform === 'android') {
            // 根据系统版本调整
            const androidVersion = this.parseAndroidVersion(system);
            if (androidVersion < 8) {
                Config.ANIMATION.DURATION = 200; // 老版本Android减少动画
            }
        }
        
        // 低端设备优化
        if (this.isLowEndDevice()) {
            this.applyLowEndOptimizations();
        }
        
        console.log('性能优化设置完成');
    }

    /**
     * 解析Android版本号
     */
    parseAndroidVersion(system) {
        const match = system.match(/Android (\d+)/);
        return match ? parseInt(match[1]) : 10; // 默认返回较新版本
    }

    /**
     * 判断是否为低端设备
     */
    isLowEndDevice() {
        const { screenWidth, screenHeight, pixelRatio } = this.deviceInfo;
        const totalPixels = screenWidth * screenHeight * pixelRatio;
        
        // 简单的低端设备判断逻辑
        return totalPixels < 1920 * 1080 * 2;
    }

    /**
     * 应用低端设备优化
     */
    applyLowEndOptimizations() {
        // 减少动画效果
        Config.ANIMATION.DURATION = 150;
        
        // 简化视觉效果
        Config.COLORS.CARD_SELECTED = Config.COLORS.PRIMARY;
        
        console.log('已应用低端设备优化');
    }

    /**
     * 坐标转换 - 将屏幕坐标转换为游戏坐标
     */
    screenToGame(screenX, screenY) {
        if (!this.adaptInfo) {
            return { x: screenX, y: screenY };
        }

        const { scale, offsetX, offsetY } = this.adaptInfo;
        const gameX = (screenX - offsetX) / scale;
        const gameY = (screenY - offsetY) / scale;

        return {
            x: gameX,
            y: gameY
        };
    }

    /**
     * 坐标转换 - 将游戏坐标转换为屏幕坐标
     */
    gameToScreen(gameX, gameY) {
        if (!this.adaptInfo) return { x: gameX, y: gameY };
        
        const { scale, offsetX, offsetY } = this.adaptInfo;
        
        return {
            x: gameX * scale + offsetX,
            y: gameY * scale + offsetY
        };
    }

    /**
     * 获取Canvas实例
     */
    getCanvas() {
        return this.canvas;
    }

    /**
     * 获取Canvas上下文
     */
    getContext() {
        return this.ctx;
    }

    /**
     * 获取设备信息
     */
    getDeviceInfo() {
        return this.deviceInfo;
    }

    /**
     * 获取适配信息
     */
    getAdaptInfo() {
        return this.adaptInfo;
    }

    /**
     * 检查是否支持某个功能
     */
    isFeatureSupported(feature) {
        switch (feature) {
            case 'vibrate':
                return this.deviceInfo.platform === 'ios' || this.deviceInfo.platform === 'android';
            case 'audio':
                return true; // 微信小游戏都支持音频
            case 'storage':
                return true; // 微信小游戏都支持本地存储
            default:
                return false;
        }
    }

    /**
     * 获取推荐的帧率
     */
    getRecommendedFPS() {
        if (this.isLowEndDevice()) {
            return 30;
        }
        return 60;
    }

    /**
     * 监听屏幕方向变化（虽然是横屏游戏，但仍需处理）
     */
    onOrientationChange(callback) {
        // 微信小游戏中监听设备方向变化
        wx.onDeviceOrientationChange && wx.onDeviceOrientationChange((res) => {
            console.log('设备方向变化:', res);
            if (callback) {
                callback(res);
            }
        });
    }

    /**
     * 显示适配信息（调试用）
     */
    showAdaptInfo() {
        console.log('=== 微信小游戏适配信息 ===');
        console.log('设备信息:', this.deviceInfo);
        console.log('适配参数:', this.adaptInfo);
        console.log('Canvas尺寸:', `${this.canvas.width}x${this.canvas.height}`);
        console.log('推荐帧率:', this.getRecommendedFPS());
        console.log('是否低端设备:', this.isLowEndDevice());
        console.log('========================');
    }

    /**
     * 测试坐标转换（调试用）
     */
    testCoordinateTransform(testPoints = []) {
        console.log('=== 坐标转换测试 ===');

        // 默认测试点
        if (testPoints.length === 0) {
            testPoints = [
                { x: 0, y: 0, desc: '左上角' },
                { x: 56.30, y: 112.11, desc: '卡牌图像点击' },
                { x: 111.97, y: 111.08, desc: '卡牌边框点击' },
                { x: 100, y: 200, desc: '测试点1' },
                { x: 200, y: 300, desc: '测试点2' }
            ];
        }

        testPoints.forEach(point => {
            const gameCoords = this.screenToGame(point.x, point.y);
            console.log(`${point.desc}: 屏幕(${point.x}, ${point.y}) -> 游戏(${gameCoords.x.toFixed(2)}, ${gameCoords.y.toFixed(2)})`);
        });

        console.log('==================');
    }

    /**
     * 简化的坐标转换 - 直接映射方法
     */
    screenToGameSimple(screenX, screenY) {
        // 最简单的方法：直接按比例缩放，不考虑偏移
        const { screenWidth, screenHeight } = this.deviceInfo;
        const designWidth = 1334;
        const designHeight = 750;

        // 使用横屏尺寸
        const actualScreenWidth = Math.max(screenWidth, screenHeight);
        const actualScreenHeight = Math.min(screenWidth, screenHeight);

        const gameX = (screenX / actualScreenWidth) * designWidth;
        const gameY = (screenY / actualScreenHeight) * designHeight;

        return { x: gameX, y: gameY };
    }

    /**
     * 修复坐标转换 - 临时修复方法
     */
    screenToGameFixed(screenX, screenY) {
        // 强制使用简化转换 - 临时修复方案
        return this.screenToGameSimple(screenX, screenY);
    }

    /**
     * 全局调试方法 - 可在控制台调用
     */
    debugCoordinates() {
        console.log('=== 坐标转换调试工具 ===');
        console.log('使用方法：');
        console.log('1. adaptManager.testCoordinateTransform() - 测试预设坐标点');
        console.log('2. adaptManager.showAdaptInfo() - 显示适配信息');
        console.log('3. adaptManager.screenToGame(x, y) - 原始转换方法');
        console.log('4. adaptManager.screenToGameFixed(x, y) - 修复转换方法');
        console.log('5. adaptManager.screenToGameSimple(x, y) - 简化转换方法');
        console.log('========================');

        // 自动显示当前适配信息
        this.showAdaptInfo();

        // 自动测试坐标转换
        this.testCoordinateTransform();
    }
}
